/*
 * @作者: 沙昊
 * @邮箱: shahao@zju.edu.cn
 * @功能: 
 * @包含算法: 
 * Copyright (c) 2023 by 沙昊, All Rights Reserved. 
 */
/*
 * @作者: 沙昊
 * @邮箱: shahao@zju.edu.cn
 * @功能: 
 * @包含算法: 
 * Copyright (c) 2023 by 沙昊, All Rights Reserved. 
 */

// #include<stdio.h>
// int main(){
//     foo();
// }
// int foo(){
//     printf("你好");
//     return 0;
// }

// #include<iostream>
// #include<cstdio>
// #include<queue>
// #include<vector>
// #include<cstring>
// #include<cmath>
// #define INF 0x3f3f3f3f
// using namespace std;
// const int N=10000;
// typedef long long ull;
// struct node{
// 	int to;
// 	ull data;
// };
// vector<node>mp[N];
// ull low[N];
// int n,m,k;
// bool vis[200][200];
// void spfa(int s){
// 	memset(low,INF,sizeof(low));
// 	int start,next;
// 	queue<int>Q;
// 	start=s;
// 	low[s]=0;
// 	Q.push(start);
// 	while(!Q.empty()){
// 		start=Q.front();
// 		Q.pop();
// 		for(int i=0;i<mp[start].size();i++){
// 			next=mp[start][i].to;
// 			if(!vis[next][start]) mp[start][i].data=0;
// 			if(low[next]>low[start]+mp[start][i].data){
// 				low[next]=low[start]+mp[start][i].data;
// 				Q.push(next);
// 			}
// 		}
// 	}
// }
// int main(){
// 	scanf("%d",&n);
// 	scanf("%d",&m);
// 	for(int i=1;i<=m;i++){
// 		int u,v,w;
// 		scanf("%d%d%d",&u,&v,&w);
// 		node temp;
// 		temp.to=u;temp.data=w;
// 		mp[v].push_back(temp);
// 		temp.to=v;
// 		mp[u].push_back(temp);
// 	}
// 	scanf("%d",&k);
// 	for(int i=0;i<k;i++){
// 		int x,y;
// 		scanf("%d%d",&x,&y);
// 		vis[x][y]=true;
// 		vis[y][x]=true;
// 	}
// 	int hx,hy;
// 	scanf("%d%d",&hx,&hy);
// 	spfa(hx);
// 	printf("%d\n",low[hy]);
// }


#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
#define N 50
char str[N][N];
int book[N][N];
struct date{
	int x;
	int y;
	int t;
}a, b;
int main()
{
	int n, m, i, j, ans, tx, ty, minn=9999999,temp=0;
	int next[4][2]={1,0, -1,0, 0,1, 0,-1};
	scanf("%d%d", &n, &m);
	for(i=0; i<n; i++)
		scanf("%s", str[i]);
	queue<date>q;
	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
			if(str[i][j]=='k')
			{
				temp=1;
				break;
			}
		if(temp==1)
			break;
	}
	a.x=i;
	a.y=j;
	a.t=0;
	q.push(a); book[i][j]=1;
	ans=0;
	while(!q.empty())
	{
		a=q.front();
		q.pop();
		if(str[a.x][a.y]=='e')
		{
			ans++;
			minn=min(minn, a.t);
			continue;
		}
		for(i=0; i<4; i++)
		{
			tx=a.x+next[i][0];
			ty=a.y+next[i][1];
			if(tx<0 || ty<0 || tx>=n || ty>=m)
				continue;
			if(str[tx][ty]!='*' && book[tx][ty]==0)
			{
				b.x=tx;
				b.y=ty;
				b.t=a.t+1;
				q.push(b);	
			}
			book[tx][ty]=1;	
		} 
	}
	if(minn==9999999)	
		printf("-1\n");
	else
		printf("%d %d\n", ans, minn);
	return 0;
}



int EuclideanClustering(std::vector<cv::Point2f> srcPts, float threshold, std::vector<std::vector<cv::Point2f>>& dstPts, std::vector<cv::Point2f>& maxPts)
	{
		if (!srcPts.size())
			return -1;
		dstPts.clear();
		float distance2;
		while (srcPts.size() > 0)//遍历srcPts所有点塞到分类的vector中
		{
			std::vector<cv::Point2f> pts;
			pts.push_back(srcPts[srcPts.size() - 1]);//返回最后一个并删除
			srcPts.pop_back();
			int flag;
			do
			{
				flag = 0;
				for (size_t i = 0; i < srcPts.size(); i++)
				{
					for (size_t j = 0; j < pts.size(); j++)
					{
						distance2 = (srcPts[i] - pts[j]).x*(srcPts[i] - pts[j]).x + (srcPts[i] - pts[j]).y*(srcPts[i] - pts[j]).y;
						if (distance2 < threshold*threshold)//如果距离小于阈值,传递过去
						{
							pts.push_back(srcPts[i]);
							srcPts.erase(srcPts.begin() + i);
							i--;
							flag++;
							break;
						}
					}
				}
			} while (flag > 0);
			dstPts.push_back(pts);
		}
		
		//找出最大的聚类
		int max_num = 0, max_no = 0;
		for (size_t i = 0; i < dstPts.size(); i++)
		{
			if (max_num < dstPts[i].size())
			{
				max_num = dstPts[i].size();
				max_no = i;
			}
		}
		maxPts = dstPts[max_no];
	}